﻿using System;

namespace 面向对象_委托1
{
    class Program
    {
        // Func : Function  方法
        // .net 框架预定义的最朴素的无参无返回值的委托，至少是有一个返回值的
        // Func 也提供了带参数的实现
        // 使用 泛型 参数，提供多达 17 个重载
        // <in T , out TResult > 最后一个永远是 返回值，前面均为参数
        static Func<int> Fun;//有返回值的Func
        static Func<int, string> Funs;//有返回值有参数的Func
        // Action : 行动 
        // .net 框架定义的最朴素的无参无返回值委托
        // Action 的存在只是为了用户省去自己声明委托的这一步
        //  为了通用，框架也提供 带参数的 Action 委托
        //  Action 使用泛型参数，可以提供多达 16 个参数（写上尖括号，按下 ctrl+shift+space 能够看到 16个泛型参数重载）
        // 包括不带参数的 一共 17 种
        static Action Act; //无参数无返回值的Action
        static Action<int> Acts;//有参数无返回值的Action

        static void Main(string[] args)
        {
            Fun = a;
            int i = Fun?.Invoke() ?? 777;//Func的调用
            Console.WriteLine(i);
            Funs = b;
            string s = Funs?.Invoke(50)??"大傻子";//有参数有返回值的Func调用
            Console.WriteLine(s);
            Act = c;
            Act?.Invoke();
            Acts = d;
            Acts?.Invoke(60);


        }
        public static int a()
        {
            Console.WriteLine("666");
            return 50;
        }
        public static string b (int b)
        {
            Console.WriteLine($"int b是{b}");
            return "大傻子";
        }
        public static void c()
        {
            Console.WriteLine("我是无参数无返回值的Action");
        }
        public static void d(int a)
        {
            Console.WriteLine($"int a是{a}");
        }

    }
}
